#ifndef FASE_H
#define FASE_H

#include <QObject>
#include <QImage>
#include "pontohash.h"
#include "enums.h"
#include <QHash>
#include <QDataStream>

class Fase : public QObject
{
    Q_OBJECT

public:
    Fase();
    Fase(QImage &imagemFase, int totalPontoX);
    Fase(QImage &imagemFase, QHash<PontoHash, editacao::Elementos> *elementosDeFase, int totalPontoX);

    ~Fase();

    QImage imagemFase()const;
    QHash<PontoHash, editacao::Elementos> *elementosDeFase()const;
    QPoint pontoPartida()const;
    int totalPontoX()const;

    void setImagemFase(QImage &imagemFase);
    void setElementoDeFase(QHash<PontoHash, editacao::Elementos> &elementosDeFase);
    void setPontoPartida(QPoint &pontoPartida);
    void setTotalPontoX(int totalPontoX);

    bool contemElemento(QPoint &ponto);
    editacao::Elementos elemento(QPoint &ponto);
    void insereElemento(QPoint &ponto, editacao::Elementos elemento);
    void insereCaixaEmPontoX(QPoint &ponto);
    void removeElemento(QPoint& ponto);
    editacao::Elementos tiraElemento(QPoint &ponto);

    static const QHash<PontoHash, quint32> *converteHash(const QHash<PontoHash, editacao::Elementos> *elementosDeFase);
    static QHash<PontoHash, editacao::Elementos> *desconverteHash(QHash<PontoHash, quint32> &elementosDeFase32);


private:
    QImage _imagemFase;
    QHash<PontoHash, editacao::Elementos> *_elementosDeFase;
    QPoint _pontoPartida;
    int _totalPontoX;

};

QDataStream& operator <<(QDataStream &stream, const Fase &fase);
QDataStream& operator >>(QDataStream &stream, Fase &fase);

#endif // FASE_H
